Os presentes dados estão disponíveis publicamente no site do governo brasileiro como parte da politica de acesso a dados públicos de forma aberta afim de ter-se transparência nos gastos públicos.
Bibliotecas usadas para carregamentos dos dados, cálculos e renderização dos gráficos.
Incluem:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import re
import csv
import glob
%matplotlib inline
pd.options.plotting.backend = "plotly"
Diversas inconsistências e dados faltantes em campos. Detalhes como datas e informação de documento faltando, ou data não preenchida ou preenchida de forma incompleta.
Amostra para o ano de 2022
# header=1 -> ignore first line header
df = pd.read_csv('data/despesa_ceaps_2022.csv', delimiter=';', header=1, encoding='iso-8859-1')
df.head()
| ANO | MES | SENADOR | TIPO_DESPESA | CNPJ_CPF | FORNECEDOR | DOCUMENTO | DATA | DETALHAMENTO | VALOR_REEMBOLSADO | COD_DOCUMENTO | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2022 | 1 | ACIR GURGACZ | Aluguel de imóveis para escritório político, c... | 004.948.028-63 | GILBERTO PISELO DO NASCIMENTO | 001/22 | 03/01/2022 | Despesa com pagamento de aluguel de imóvel par... | 6000 | 2173614 |
| 1 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 26.320.603/0001-64 | INFORMANAHORA | 000000000000310/A | 04/01/2022 | Despesa com divulgação da atividade parlamenta... | 1500 | 2173615 |
| 2 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 13.659.201/0001-47 | LINHA PURPURA FOTO E VIDEO LTDA | 107 | 14/01/2022 | Despesa com produção de texto e edição de víde... | 6000 | 2173616 |
| 3 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 23.652.846/0001-01 | ROBERTO GUTIERREZ DA ROCHA M.E.I. | 187 | 18/01/2022 | Divulgação da atividade parlamentar | 1000 | 2173618 |
| 4 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 08.941.827/0001-01 | RONDONIA DINÂMICA COM. E SERV. DE INFORMÁTICA ... | 000000000001772/A | 17/01/2022 | Divulgação da atividade parlamentar | 2000 | 2173617 |
Carregando lista de arquivos contendo os dados para análise.
datas = {}
for file in sorted(glob.glob('data/*.csv')):
if re.search(r'[0-9]+(.csv)', file):
print('> load... ', file)
datas[ re.search(r'[0-9]+', file ).group(0) ] = pd.read_csv(file, delimiter=';', header=1, encoding='iso-8859-1')
#(lambda d, x: [d.pop(i) for i in x] )(datas, ['2008','2009', '2010', '2011','2012'])
> load... data/despesa_ceaps_2008.csv > load... data/despesa_ceaps_2009.csv > load... data/despesa_ceaps_2010.csv > load... data/despesa_ceaps_2011.csv > load... data/despesa_ceaps_2012.csv > load... data/despesa_ceaps_2013.csv > load... data/despesa_ceaps_2014.csv > load... data/despesa_ceaps_2015.csv > load... data/despesa_ceaps_2016.csv > load... data/despesa_ceaps_2017.csv > load... data/despesa_ceaps_2018.csv > load... data/despesa_ceaps_2019.csv > load... data/despesa_ceaps_2020.csv > load... data/despesa_ceaps_2021.csv > load... data/despesa_ceaps_2022.csv
Concatenando as tabelas de dados para formar um único da dataframe com os dados para análise.
dff = pd.concat(datas, ignore_index=True)
dff.loc[0:dff.shape[0],'VALOR_REEMBOLSADO'].replace(r'(\s)', '', regex=True, inplace=True)
dff.loc[0:dff.shape[0],'VALOR_REEMBOLSADO'].replace(r'(\n)','', regex=True, inplace=True)
dff.loc[0:dff.shape[0], 'VALOR_REEMBOLSADO'].replace(r'(\r)', '', regex=True, inplace=True)
dff.head()
| ANO | MES | SENADOR | TIPO_DESPESA | CNPJ_CPF | FORNECEDOR | DOCUMENTO | DATA | DETALHAMENTO | VALOR_REEMBOLSADO | COD_DOCUMENTO | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2008 | 9 | ADA MELLO | Contratação de consultorias, assessorias, pesq... | NaN | NaN | NaN | NaN | NaN | 12351,52 | 2.008091e+12 |
| 1 | 2008 | 9 | ADA MELLO | Locomoção, hospedagem, alimentação, combustíve... | NaN | NaN | NaN | NaN | NaN | 386,6 | 2.008091e+12 |
| 2 | 2008 | 10 | ADA MELLO | Contratação de consultorias, assessorias, pesq... | NaN | NaN | NaN | NaN | NaN | 12351,52 | 2.008101e+12 |
| 3 | 2008 | 10 | ADA MELLO | Locomoção, hospedagem, alimentação, combustíve... | NaN | NaN | NaN | NaN | NaN | 2610,68 | 2.008101e+12 |
| 4 | 2008 | 11 | ADA MELLO | Contratação de consultorias, assessorias, pesq... | NaN | NaN | NaN | NaN | NaN | 12351,52 | 2.008111e+12 |
dff.loc[0:,'VALOR_REEMBOLSADO'].replace( regex=r'(,)', value='.', inplace=True )
#dff.loc[0:dff.shape[0],'VALOR_REEMBOLSADO'] =dff.loc[0:dff.shape[0],'VALOR_REEMBOLSADO'].replace( regex={r'(,)':'.'} )
#dfs['VALOR_REEMBOLSADO'] = pd.to_numeric(dff['VALOR_REEMBOLSADO'], downcast='float')
dff.head()
| ANO | MES | SENADOR | TIPO_DESPESA | CNPJ_CPF | FORNECEDOR | DOCUMENTO | DATA | DETALHAMENTO | VALOR_REEMBOLSADO | COD_DOCUMENTO | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2008 | 9 | ADA MELLO | Contratação de consultorias, assessorias, pesq... | NaN | NaN | NaN | NaN | NaN | 12351.52 | 2.008091e+12 |
| 1 | 2008 | 9 | ADA MELLO | Locomoção, hospedagem, alimentação, combustíve... | NaN | NaN | NaN | NaN | NaN | 386.6 | 2.008091e+12 |
| 2 | 2008 | 10 | ADA MELLO | Contratação de consultorias, assessorias, pesq... | NaN | NaN | NaN | NaN | NaN | 12351.52 | 2.008101e+12 |
| 3 | 2008 | 10 | ADA MELLO | Locomoção, hospedagem, alimentação, combustíve... | NaN | NaN | NaN | NaN | NaN | 2610.68 | 2.008101e+12 |
| 4 | 2008 | 11 | ADA MELLO | Contratação de consultorias, assessorias, pesq... | NaN | NaN | NaN | NaN | NaN | 12351.52 | 2.008111e+12 |
dff.loc[0:, 'VALOR_REEMBOLSADO'] = pd.to_numeric(dff.loc[0:,'VALOR_REEMBOLSADO'], downcast='float')
#dff.dropna(inplace=True)
#dff.to_csv('data.csv', index=False)
/tmp/ipykernel_34592/1191592795.py:1: FutureWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)` dff.loc[0:, 'VALOR_REEMBOLSADO'] = pd.to_numeric(dff.loc[0:,'VALOR_REEMBOLSADO'], downcast='float')
No campo 'VALOR_REEMBOLSADO' trocar virgula por ponto e converter para tipo numérico (float).
df['VALOR_REEMBOLSADO'] = pd.to_numeric( df['VALOR_REEMBOLSADO'].replace(regex=r'(,)', value='.'), downcast='float')
df.head()
| ANO | MES | SENADOR | TIPO_DESPESA | CNPJ_CPF | FORNECEDOR | DOCUMENTO | DATA | DETALHAMENTO | VALOR_REEMBOLSADO | COD_DOCUMENTO | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2022 | 1 | ACIR GURGACZ | Aluguel de imóveis para escritório político, c... | 004.948.028-63 | GILBERTO PISELO DO NASCIMENTO | 001/22 | 03/01/2022 | Despesa com pagamento de aluguel de imóvel par... | 6000.0 | 2173614 |
| 1 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 26.320.603/0001-64 | INFORMANAHORA | 000000000000310/A | 04/01/2022 | Despesa com divulgação da atividade parlamenta... | 1500.0 | 2173615 |
| 2 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 13.659.201/0001-47 | LINHA PURPURA FOTO E VIDEO LTDA | 107 | 14/01/2022 | Despesa com produção de texto e edição de víde... | 6000.0 | 2173616 |
| 3 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 23.652.846/0001-01 | ROBERTO GUTIERREZ DA ROCHA M.E.I. | 187 | 18/01/2022 | Divulgação da atividade parlamentar | 1000.0 | 2173618 |
| 4 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 08.941.827/0001-01 | RONDONIA DINÂMICA COM. E SERV. DE INFORMÁTICA ... | 000000000001772/A | 17/01/2022 | Divulgação da atividade parlamentar | 2000.0 | 2173617 |
Converter campo 'DATA' do tipo string para tipo Date. Campos de data não preenchidos ou preenchidos em formato incorreto será ignorados mantendo conteúdo antigo sem ser convertido para o tipo "datetime" do Python.
# Converter DATA para tipo Date
df['DATA'] = pd.to_datetime(df['DATA'], dayfirst=True, errors='ignore')
df
| ANO | MES | SENADOR | TIPO_DESPESA | CNPJ_CPF | FORNECEDOR | DOCUMENTO | DATA | DETALHAMENTO | VALOR_REEMBOLSADO | COD_DOCUMENTO | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2022 | 1 | ACIR GURGACZ | Aluguel de imóveis para escritório político, c... | 004.948.028-63 | GILBERTO PISELO DO NASCIMENTO | 001/22 | 2022-01-03 | Despesa com pagamento de aluguel de imóvel par... | 6000.00 | 2173614 |
| 1 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 26.320.603/0001-64 | INFORMANAHORA | 000000000000310/A | 2022-01-04 | Despesa com divulgação da atividade parlamenta... | 1500.00 | 2173615 |
| 2 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 13.659.201/0001-47 | LINHA PURPURA FOTO E VIDEO LTDA | 107 | 2022-01-14 | Despesa com produção de texto e edição de víde... | 6000.00 | 2173616 |
| 3 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 23.652.846/0001-01 | ROBERTO GUTIERREZ DA ROCHA M.E.I. | 187 | 2022-01-18 | Divulgação da atividade parlamentar | 1000.00 | 2173618 |
| 4 | 2022 | 1 | ACIR GURGACZ | Divulgação da atividade parlamentar | 08.941.827/0001-01 | RONDONIA DINÂMICA COM. E SERV. DE INFORMÁTICA ... | 000000000001772/A | 2022-01-17 | Divulgação da atividade parlamentar | 2000.00 | 2173617 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 16593 | 2022 | 12 | ZEQUINHA MARINHO | Passagens aéreas, aquáticas e terrestres nacio... | 22.052.777/0001-32 | Exceller Tour | WIXHAI | 2022-12-06 | Companhia Aérea: LATAM, Localizador: WIXHAI. P... | 2893.04 | 2191398 |
| 16594 | 2022 | 12 | ZEQUINHA MARINHO | Passagens aéreas, aquáticas e terrestres nacio... | 22.052.777/0001-32 | Exceller Tour | WITOLM | 2022-12-09 | Companhia Aérea: GOL, Localizador: WITOLM. Pas... | 1180.19 | 2192272 |
| 16595 | 2022 | 12 | ZEQUINHA MARINHO | Passagens aéreas, aquáticas e terrestres nacio... | 22.052.777/0001-32 | Exceller Tour | THPKVQ | 2022-12-20 | Companhia Aérea: TAM, Localizador: THPKVQ. Pas... | 2671.90 | 2192274 |
| 16596 | 2022 | 12 | ZEQUINHA MARINHO | Passagens aéreas, aquáticas e terrestres nacio... | 22.052.777/0001-32 | Exceller Tour | QNN9HX | 2022-12-21 | Companhia Aérea: AZUL, Localizador: QNN9HX. Pa... | 1334.31 | 2192244 |
| 16597 | 2022 | 12 | ZEQUINHA MARINHO | Passagens aéreas, aquáticas e terrestres nacio... | 22.052.777/0001-32 | Exceller Tour | WMQWBX | 2022-12-30 | Companhia Aérea: TAM, Localizador: WMQWBX. Pas... | 2250.72 | 2193622 |
16598 rows × 11 columns
senadores = df['SENADOR'].unique()
df_gastos_sn = { 'Senador':[], 'GastoAnual':[], 'RegsSemDocumento':[], 'RegsSemDetalhamentoDoGasto':[] }
for i in senadores:
df_gastos_sn['Senador'].append(i)
df_gastos_sn['GastoAnual'].append( df[ df['SENADOR'] == i ]['VALOR_REEMBOLSADO'].sum() )
df_gastos_sn['RegsSemDocumento'].append( df[ df['DOCUMENTO'].isna() == True][df['SENADOR'] == i ].isna().sum()['DOCUMENTO'] )
df_gastos_sn['RegsSemDetalhamentoDoGasto'].append( df[ df['DETALHAMENTO'].isna() == True][df['SENADOR'] == i ].isna().sum()['DETALHAMENTO'] )
/tmp/ipykernel_34592/4245188335.py:4: UserWarning: Boolean Series key will be reindexed to match DataFrame index. df_gastos_sn['RegsSemDocumento'].append( df[ df['DOCUMENTO'].isna() == True][df['SENADOR'] == i ].isna().sum()['DOCUMENTO'] ) /tmp/ipykernel_34592/4245188335.py:5: UserWarning: Boolean Series key will be reindexed to match DataFrame index. df_gastos_sn['RegsSemDetalhamentoDoGasto'].append( df[ df['DETALHAMENTO'].isna() == True][df['SENADOR'] == i ].isna().sum()['DETALHAMENTO'] )
#ds = pd.DataFrame( { 'Senador': df_gastos_sn['Senador'], 'Gastos': df_gastos_sn['GastoAnual'] })
ds = pd.DataFrame( df_gastos_sn )
ds = ds.sort_values(by=['GastoAnual'], ascending=False)
ds
| Senador | GastoAnual | RegsSemDocumento | RegsSemDetalhamentoDoGasto | |
|---|---|---|---|---|
| 50 | LUCAS BARRETO | 511319.78 | 0.0 | 228.0 |
| 90 | TELMÁRIO MOTA | 488693.40 | 0.0 | 249.0 |
| 64 | MECIAS DE JESUS | 488586.66 | 0.0 | 127.0 |
| 68 | OMAR AZIZ | 487541.24 | 0.0 | 0.0 |
| 9 | CHICO RODRIGUES | 486958.05 | 0.0 | 72.0 |
| ... | ... | ... | ... | ... |
| 5 | ANTONIO ANASTASIA | 19647.13 | 3.0 | 15.0 |
| 33 | GUARACY SILVEIRA | 19285.82 | 0.0 | 1.0 |
| 49 | LEILA BARROS | 10567.64 | 12.0 | 12.0 |
| 63 | MARIA ELIZA DE AGUIAR E SILVA | 10136.42 | 0.0 | 0.0 |
| 84 | SAMUEL ARAUJO | 3233.90 | 0.0 | 0.0 |
97 rows × 4 columns
ds[:10].plot(x='Senador', y='GastoAnual', title='Gastos (R$) Senadores Brasileiros 2022', kind='bar')
ds.sort_values(by=['RegsSemDocumento'], ascending=False)[:10].plot(x='Senador', y='RegsSemDocumento', title='10 Sen. Sem Documento de Registro do Gasto', kind='bar')
# Número de campos não preenchidos para senadora 'Zenaide Maia'. Neste trecho é possível contar quantos senadores não
# preencheram o campo para o documento do gasto declarado.
#df[ df['DOCUMENTO'].isna() == True][df['SENADOR'] == 'ZENAIDE MAIA'].isna().sum()
# Plotly geneate fle to graphics host
#import plotly.io as pio
#fig_a = ds[:10].plot(x='Senador', y='GastoAnual', title='Gastos (R$) Senadores Brasileiros 2022', kind='bar')
#fig_b = ds.sort_values(by=['RegsSemDocumento'], ascending=False)[:10].plot(x='Senador', y='RegsSemDocumento', title='10 Sen. Sem Documento de Registro do Gasto', kind='bar')
#pio.write_html(fig_a, file='figa.html', auto_open=True)
#pio.write_html(fig_b, file='figb.html', auto_open=True)